package com.qtrue.thread2;

/**
 * @Package: com.qtrue.thread2
 * @ClassName: BankTest
 * @Author: xiaoBao
 * @CreateTime: 2022-05-09 12:03
 * @Description:使用同步机制将单例模式中的懒汉式改写为线程安全的。
 */
public class BankTest {

}

// 单例模式的Bank类
class Bank{

    private Bank(){}

    private static Bank instance = null;

    public static Bank getInstnce(){
        // 方式一：效率较差
//        synchronized (Bank.class){
//            if (instance == null){
//                instance = new Bank();
//            }
//            return instance;
//        }

        // 方式二：效率更高，双重检查。
        /*
            1. 以下有必要进行两次判断，在多线程调用该方法的情况下，因为第一次线程没有加锁，所以出现多个线程进入if内的情况，这时候需要第二个if来保证只有一个实例化对象。
            2. 如果去掉第二个if，可能会出现多个线程同时进入了if体内，然后第一个线程new了一个Bank对象，释放锁后，第二个线程得到锁并又new了一个Bank，就不是单例模式了。
        */
        if (instance == null){

            synchronized (Bank.class){
                if (instance == null){
                    instance = new Bank();
                }
            }

        }
        return instance;
    }

}